package com.hsu.hsurpc.serializer;

import com.hsu.hsurpc.spi.SpiLoader;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 序列化器工厂类，用于获取序列化器对象
 * @Author Hsu琛君珩
 * @Date 2024-09-19 17:25
 * @Description
 * @Version: v1.0.0
 */
public class SerializerFactory {

    /**
     * 存储各个序列化器实例的 Map，使用线程安全的 ConcurrentHashMap
     */
    private static final Map<String, Serializer> KEY_SERIALIZER_MAP = new ConcurrentHashMap<>();

    /**
     * 默认序列化器
     */
    private static final Serializer DEFAULT_SERIALIZER = new JdkSerializer();

    /**
     * 获取序列化器实例
     * 使用懒加载方式，只有在首次请求时创建实例
     *
     * @param key 序列化器名称（如 "json", "hessian"）
     * @return 序列化器实例
     */
    public static Serializer getInstance(String key) {
        // 从 Map 中获取已有实例，如果不存在则进行创建
        return KEY_SERIALIZER_MAP.computeIfAbsent(key, SerializerFactory::createSerializer);
    }

    /**
     * 创建序列化器实例的方法，通过 SPI 动态加载指定的序列化器
     *
     * @param key 序列化器名称
     * @return 创建好的序列化器实例
     */
    private static Serializer createSerializer(String key) {
        // 使用 SPI Loader 动态加载序列化器
        Serializer serializer = SpiLoader.getInstance(Serializer.class, key);
        return (serializer != null) ? serializer : DEFAULT_SERIALIZER;
    }
}
